package com.naiterui.ehp.bs.patient.dao.mongo;

import java.util.List;

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

/**
 * 基于Spring MongoTemplate的MongoDB操作封装
 * <P>File name : MongoBaseDao.java </P>
 * <P>Author : zhouyanxin </P>
 * <P>Date : 2015年6月28日 </P>
 */
public abstract class MongoBaseDao {

    protected abstract MongoTemplate getMongoTemplate();

    /**
     * 分页查询
     * MongoBaseDao.find()<BR>
     * <P>Author : zhouyanxin </P>
     * <P>Date : 2014-10-11 </P>
     *
     * @param query
     * @param entityClass
     * @param collectionName
     * @param num
     *
     * @return
     */
    protected <T> List<T> find(Query query, Class<T> entityClass, String collectionName) {
        return this.getMongoTemplate().find(query, entityClass, collectionName);
    }

    /**
     * 查询总数量
     * MongoBaseDao.queryCount()<BR>
     * <P>Author : zhouyanxin </P>
     * <P>Date : 2014-10-11 </P>
     *
     * @param query
     * @param collectionName
     *
     * @return
     */
    protected long queryCount(Query query, String collectionName) {
        return this.getMongoTemplate().count(query, collectionName);
    }

    /**
     * 保存
     * MongoBaseDao.save()<BR>
     * <P>Author : zhouyanxin </P>
     * <P>Date : 2014-10-20 </P>
     *
     * @param save
     * @param collectionName
     *
     * @return
     */
    protected <T> void save(T t, String collectionName) {
        this.getMongoTemplate().save(t, collectionName);
    }

    /**
     * 查找全部
     * MongoBaseDao.findAll()<BR>
     * <P>Author : zhouyanxin </P>
     * <P>Date : 2014-10-20 </P>
     *
     * @param save
     * @param collectionName
     *
     * @return
     */
    protected <T> List<T> findAll(Class<T> entityClass, String collectionName) {
        return this.getMongoTemplate().findAll(entityClass, collectionName);
    }

    /**
     * 更新对象
     * MongoBaseDao.update()<BR>
     * <P>Author : zhouyanxin </P>
     * <P>Date : 2014-12-20 </P>
     *
     * @param update
     *
     * @return
     */
    protected <T> void update(Class<T> entityClass, String collectionName, Query query, Update update) {
        this.getMongoTemplate().updateFirst(query, update, entityClass, collectionName);
    }

    /**
     * 删除对象
     * MongoBaseDao.remove()<BR>
     * <P>Author : zhouyanxin </P>
     * <P>Date : 2014-12-01 </P>
     *
     * @param t
     * @param collectionName
     *
     * @return
     */
    protected <T> void remove(T t, String collectionName) {
        this.getMongoTemplate().remove(t, collectionName);
    }

}
